home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Speccy ClassiX 1998
/
Speccy ClassiX 98.iso
/
amiga_system
/
the_aminet
/
comm
/
news
/
npns.lha
/
NPNS
/
sendnews.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-30
|
8KB
|
316 lines
/*
* Program sendnews
* Programmer N.d'Alterio
* Date 06/08/95
*
* Synopsis: This program sends news which has been spooled by
* postnews using NNTPpost from INETUtils. If not
* online then the program will exit and do nothing.
* 'Onlineness' is checked by trying to open the
* TCP daytime port.
*
* This program was adapted from the postnewsspool
* package by James Burton which although useful
* was bugged. It could often hang, it gave little
* info as what it was doing, it left locks on the
* spool dir and was over complicated.
*
* It is specifically compiled for my INET set up
* i.e. spool dir AmiTCP:Usr/Spool/News
* NNTPPost AmiTCP:bin/NNTPPost
* failed arc AmiTCP:Usr/Spool/sendnews.failed
*
* These may be changed using the ENV variables
* PNS_SPOOLDIR and PNS_SEQFILE
*
* If NNTPpost fails the article is appended to
* the file AmiTCP:Usr/Spool/sendnews.failed or
* the ENV variable PNS_FAILED_ARC. Each file has
* a header with the date the file failed.
*
* Command Line Arguments: None
*
* Inputs: Needs enviroment variables NNTPSERVER
* PNS_SPOOLDIR (opt)
* PNS_NNTPPOST (opt)
* PNS_FAILED_ARC (opt)
*
*
* Outputs: None
*
* Variables: BPTR lock - lock on spool dir
* BPTR old_lock - lock on old current dir
* char *Buffer - string to build command in
* char *spooldir - spool dir name
* char *nntppost - nntppost prog name
* char *failed_arc - failed archive filename
* int count - number of articles sent
* int exit_code - prog return code
* FILE *fptr - file pointer to TCP:daytime port
* *fib - file info block pointer
*
* Functions: save_failed - saves failed messages to failed archive
*
* $VER: sendnews.c 2.1 (07.08.95) $
* $Log: sendnews.c $
* Revision 3.1 1995/09/09 20:44:51 daltern
* REWRITE: Now uses ADOS functions
* does not need seqfile anymore
* will send anything that is the spool dir whatever the name
* failed arc now separates files with a date string containing
* the date the file failed
* New env variable user can now specify nntpposting prog
*
* Revision 2.3 1995/09/09 20:41:19 daltern
* now opens dos library version >37
*
* Revision 2.2 1995/08/27 21:32:56 daltern
* fixed a couple of typos
*
* Revision 2.1 1995/08/27 21:29:18 daltern
* Added some ENV var checking for paths and files
* Fixed a bug that left a file open
*
* Revision 1.3 1995/08/07 13:07:23 daltern
* added saving of failed messages
*
* Revision 1.2 1995/08/07 12:48:19 daltern
* Added version string
*
* Revision 1.1 1995/08/07 12:45:05 daltern
* Initial revision
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos/dos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <exec/types.h>
#define SPOOLDIR "AmiTCP:Usr/Spool/News"
#define FAILED_ARC "AmiTCP:Usr/Spool/sendnews.failed"
#define NNTPSERVER NNTPServer
#define NNTPPOSTER "AmiTCP:bin/NNTPPost"
void save_failed( char *, char * );
extern struct Library *DOSBase;
extern char *version = "$VER: sendnews 3.3 (30.09.95) Nick d'Alterio";
int main( void )
{
int count;
int exit_code = 0;
char *spooldir;
char *failed_arc;
char *nntppost;
char Buffer[128];
FILE *fptr;
BPTR lock;
BPTR old_lock;
struct FileInfoBlock *fib;
/*
* Check if online.
*/
if ( ( fptr = fopen( "TCP:localhost/daytime", "r" ) ) == NULL ) {
fprintf( stderr, " You cant send news if you are not online !\n" );
exit(exit_code);
} /* end if */
fclose( fptr );
/*
* Read env variable to get NNTP server.
*/
if ( getenv("NNTPSERVER") == NULL ) {
fprintf( stderr, " You must specify a NNTP news server\n" );
exit(10);
} /* end if */
/*
* Read name of NNTP posting program
*/
if ( ( nntppost = getenv( "PNS_NNTPPOST" ) ) == NULL ) {
nntppost = NNTPPOSTER;
} /* end if */
/*
* Read spool dir env variable.
*/
if ( ( spooldir = getenv( "PNS_SPOOLDIR" ) ) == NULL ) {
spooldir = SPOOLDIR;
} /* end if */
/*
* Read failed archive name from env variable.
*/
if ( ( failed_arc = getenv( "PNS_FAILED_ARC" ) ) == NULL ) {
failed_arc = FAILED_ARC;
} /* end if */
/*
* Open DOS library.
*/
if ( DOSBase = OpenLibrary( "dos.library", 37 ) ) {
/*
* Lock the spool directory whilst posting.
*/
if ( lock = Lock( spooldir, ACCESS_READ ) ) {
/*
* Change current dir to spool dir and alloc fib
*/
old_lock = CurrentDir( lock );
if ( fib = AllocDosObject( DOS_FIB, NULL ) ) {
/*
* Examine all the contents of spool dir and try to post
* every message.
*/
count = 0;
Examine( lock, fib );
while( ExNext( lock, fib ) ) {
count++;
sprintf( Buffer, "%s >NIL: %s", nntppost, fib->fib_FileName );
if ( !( system( Buffer ) ) ) {
fprintf( stderr, " Posted article %d\n", count );
} else {
fprintf( stderr, " Failed to post article %d - saving \n", count );
save_failed( fib->fib_FileName, failed_arc );
} /* end if */
if ( !( DeleteFile( fib->fib_FileName ) ) )
PrintFault( IoErr(), fib->fib_FileName );
} /* end while */
FreeDosObject( DOS_FIB, fib );
} else {
exit_code = 20;
} /* end if alloc dos obj */
CurrentDir( old_lock );
UnLock( lock );
} else {
PrintFault( IoErr(), NULL );
exit_code = 10;
} /* end if lock */
CloseLibrary( DOSBase );
} else {
fprintf( stderr, " Could not open dos.library > v37\n" );
exit_code = 20;
} /* end if library */
exit(exit_code);
} /* end program sendnews */
/*========================================================================*
END
*========================================================================*/
/*========================================================================*
BEGIN FUNCTION save_failed
*========================================================================*/
void save_failed( char *failed_file, char *arc_file )
{
FILE *arc_fp;
FILE *msg_fp;
struct DateStamp ds;
struct DateTime *dt;
int ch;
if ( !( arc_fp = fopen( arc_file, "a" ) ) ) {
fprintf( stderr, " Could not open failed archive\n" );
} /* end if */
if ( !( msg_fp = fopen( failed_file, "r" ) ) ) {
fprintf( stderr, " Could not open message file to backup\n" );
fclose( arc_fp );
return;
} /* end if */
/*
* Print a header for failed file containing date.
*/
dt = ( struct DateTime *)malloc( sizeof( struct DateTime ) );
dt->dat_StrDay = (char *)malloc( 20 * sizeof( char ) );
dt->dat_StrTime = (char *)malloc( 20 * sizeof( char ) );
dt->dat_StrDate = (char *)malloc( 20 * sizeof( char ) );
dt->dat_Format = FORMAT_DOS;
dt->dat_Flags = NULL;
DateStamp( &ds );
dt->dat_Stamp = ds;
DateToStr( dt );
fprintf( arc_fp, "\n\n ********************* %s %s %s ******************* \n\n",
dt->dat_StrTime,
dt->dat_StrDay,
dt->dat_StrDate );
free( dt->dat_StrTime );
free( dt->dat_StrDay );
free( dt->dat_StrDate );
free( dt );
/*
* Now copy msg to archive
*/
while ( ( ch = fgetc( msg_fp ) ) != EOF ) fputc( ch, arc_fp );
fclose( arc_fp );
fclose( msg_fp );
return;
} /* end function save_failed */
/*========================================================================*
END save_failed
*========================================================================*/